fix(desktop): startup flash, titlebar overlap, clickable file cards#146
Merged
Conversation
…cards Three issues from live tauri:dev review: 1. Startup B&W "cat" flash — in dev, Vite injects index.css via JS, so the first paint was unstyled and the BrandMark <svg> (no explicit size, fill=currentColor) ballooned to a full-size black silhouette on white. Add render-blocking critical CSS to index.html (dark surface + pinned .mark box) so the first paint matches the app — no flash. 2. Transparent titlebar overlapped content (sidebar brand / chat-header pills / inspector head clipped). Add a 30px top inset on .app-shell so all columns clear the macOS traffic-light/title region (box-sizing is global border-box; the native title strip stays OS-draggable; no app-region drag so chat text stays selectable). 3. File outputs now get a clickable card. ToolCard gains an `onOpen` affordance; Repl passes it for any tool with a `file_path` (Read/Write/ Edit), wired through App → renderScreen → ReplScreen to fp.open — clicking loads the file into the right-side preview panel. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When DeepSeek emits a Write/Edit/Read call with no arguments (typically output-token truncation on a large file before the args stream), the tool returned a cryptic "missing file_path". Now it explains the likely cause (ran out of output tokens — raise Effort / smaller file) or lists the keys that did arrive, which both helps the user and gives the model a usable hint. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sidebar sessions showed raw ids and had no management actions. - Titles: title a brand-new session from its first user message (mac-agent sessionSetTitle) so the sidebar shows a human label immediately instead of the id; the Rust read-time derive remains the fallback. - Archive / Delete: new session_delete + session_archive Rust commands (archive moves the .jsonl into sessions/archived/, excluded from the list; delete removes it — both guarded against path-traversal ids) + tauri-api wrappers. Sidebar rows reveal 🗄/🗑 on hover (delete confirms); removing the active session resets the chat via a new onSessionRemoved callback. - Freshness: the sidebar now polls (8s) + reloads on active-session change so titles and new sessions surface without a remount. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The dock icon (.icns) was stale — generated from an older render — so it showed washed-out while the PNGs were already the crisp white-cat-on-blue mark. Regenerated icon.icns from icon.svg via `tauri icon` so the dock / Finder icon matches the intended design. (Non-macOS assets that tauri icon emits — Windows/Android/iOS — were discarded; this is a macOS-only app.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reshape the message stream toward Claude Code: a centered ~760px readable column instead of full-bleed, drop the heavy YO/DC avatar chips, give user turns a soft bubble while assistant/system are plain prose, and tighten the inter-message spacing. Sidebar search + top-bar cleanup land in pass 2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Desktop sessions tag each message line type:"message", but CLI/headless
sessions persist bare {role,content} lines with no type field. session_read
and derive_session_title both filtered on type=="message", so CLI sessions
loaded as an empty chat and showed their id instead of a title. Accept a
line as a message when type=="message" OR (type absent AND role is
user/assistant). Verified: a CLI session went 0→1 messages with a derived
title.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…earch, compact project - Composer now aligns to the centered message column (760px) instead of spanning full width — cohesive chat area like Claude Code. - Sidebar: add a session search/filter box; replace the heavy boxed PROJECT chip with a compact one-line project row (the header breadcrumb carries the path already). - Add a dev-only full-app preview harness (preview-app.html/.tsx) that renders <App/> with a mocked Tauri invoke, so layout can be screenshotted + iterated without a rebuild. Not in the prod bundle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…er icon
The inspector rail's four hint icons (▤◐📁ⓘ) all expanded the same Inspector
panel, so "clicking anything on the right is just the inspector". Rework it
into a VS Code-style activity bar: the 48px rail is always present on the far
right and each icon opens its OWN panel to its left, exactly one at a time.
- ⓘ Inspector — plan / context / recent files / session (plan badge + context tint)
- 📄 Files — the file preview panel (Source / Diff / History)
- ⚙ Settings — the Settings shell (main-area screen)
App: replace inspectorExpanded/inspectorFocus/expandInspector with
inspectorOpen + a filesCollapsed flag; toggleInspector/toggleFiles/openFile
enforce single-panel mutual exclusion (opening one closes the other; an active
icon closes its panel; Files with no tabs invokes the picker). The rail is now
rendered unconditionally as the last grid child; .inspector-open gains the 48px
rail track so the inspector squeezes chat beside the rail instead of replacing
it. Monochrome SVG icons replace the unicode glyphs.
preview-app: mock plugin:dialog|open + correct tool_read ({content}) so the
file panel is exercisable in the browser preview.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r inset The 30px shell padding already clears the macOS traffic lights, so each column's extra top padding (sidebar 18 / chat-header 12 / rail 14 / inspector-head 18) was pure dead space — content sat ~46px down with an empty strip above it. Trim those so the brand / breadcrumb / pills / inspector title align ~34px from the window top, just below the titlebar (Claude-Code-style compact top). The inspector loses its panel top padding and the sticky head's −18px margin trick (top:0 now), keeping its title aligned with the rest. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three issues from live
tauri:devreview:index.cssvia JS, so the first paint was unstyled and theBrandMark<svg>(no explicit size,fill=currentColor) ballooned to a full-size black silhouette on white. Added render-blocking critical CSS toindex.html(dark surface + pinned.markbox) so the first paint matches the app — no flash..app-shellso all columns clear the macOS traffic-light/title region. Chat text stays selectable (no shell-wideapp-region: drag); the native title strip stays draggable.ToolCardgains anonOpenaffordance; the Repl passes it for any tool with afile_path(Read/Write/Edit), wired App → renderScreen → ReplScreen →fp.open. Clicking loads the file into the right-side preview panel (the §3.11 panel from feat(desktop): right-side file panel — Source/Diff/History + tabs + resize (#11) #145).Typecheck + desktop build green.
🤖 Generated with Claude Code